<?php

/**
 * Class Util 工具类
 */

namespace TigrisMQ;

class Util
{
    /**
     * 组合请求参数
     * @param  string $topic 队列名称
     * @param  string $appId 统一分配的appId
     * @return array  $parameters 组合后的请求参数
     */
    private static function composeParameters($appId) {
        $parameters['AppId'] = $appId;
        $parameters['Timestamp'] = time();
        $parameters['SignatureNonce'] = md5(uniqid(mt_rand(), true));
        return $parameters;
    }

    /**
     * 计算签名
     * @param  string $appSecret 统一分配的appSecret
     * @param  string $method 请求的HTTP 方法
     * @param  string $path  请求的URL
     * @param  string $parameters 组合后的请求参数
     * @return string 计算签名的结果  
     */
    private static function computeSignature($appSecret, $method, $path, $parameters) {
        ksort($parameters);
        $stringToSign = strtoupper($method) . '&' . urlencode($path) . '&' . http_build_query($parameters);
        return hash_hmac('sha1', $stringToSign, $appSecret);
    }

    /**
     * 执行请求
     * @param  string $endpoint Tigris的域名或Host
     * @param  string $method 请求的HTTP 方法
     * @param  string $path  请求的URL
     * @param  string $parameters 请求参数
     * @return string 返回的结果  
     */
    public static function doRequest($endpoint, $method, $path, $appId, $appSecret, $parameters) {
        $queryParameters = self::composeParameters($appId);
        $forSignParameters = array_merge($queryParameters, $parameters);
        $queryParameters['Signature'] = self::computeSignature($appSecret, $method, $path, $forSignParameters);

        $ch = curl_init();
        if (strtoupper($method) == 'POST') {
            $queryString = http_build_query($queryParameters);
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($parameters));
        } else {
            $queryString = http_build_query(array_merge($queryParameters, $parameters));
        }
        curl_setopt($ch, CURLOPT_URL, $endpoint . $path . '?' . $queryString);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_TIMEOUT, 10);
        $output = curl_exec($ch);
        curl_close($ch);
        return json_decode($output, true);
    }
}